#include <iostream>

using std::cout;
using std::endl;

//带参数的宏定义(宏函数),在预处理阶段进行字符串的替换，可以避免
//函数的调用开销,宏定义一旦出现了错误，只有到了运行之后，才能
//发现其中可能出现的错误
#define ADD(x, y) ((x) + (y))

//普通函数的调用是由开销的（参数入栈出栈）

//内联函数的特点是：在调用函数的时候，直接用函数体去替代函数的
//调用
//优点：同时具备用函数体替代函数调用的优点，也具备普通函数进行
//安全检查的问题
//缺点：
//
//
//注意：对于目前的编译器而言，很多时候如果你不加inline也会默认
//将某些函数设置为内联函数，有些时候即使将inline关键字写出来了
//编译器也会认为该函数不是内联函数
//所以，最好按照自己的方式进行设置，如果想将函数设置为内联函数
//就加上inline，如果不想设置就不加inline
inline 
int add(int x, int y)
{
    return x + y;
}

int main(int argc, char *argv[])
{
    int a = 3; 
    int b = 4;
    int c = 10;
    //add(a, b)会进行函数的调用,会进行形参与实参的结合，然后函数
    //的参数会进行入栈出栈,函数调用的时候，还需要保留函数的调用
    //现场，这样当函数调用结束之后，可以返回到函数调用这里来
    //所以，所有这些操作都是会有内存开销的
    cout << "add(a, b) = " << add(a, b) << endl;
    cout << "ADD(a, c) = " << ADD(a, c) << endl;
    cout << "ADD(a + b, c + a) = " << ADD(a + b, c + a) << endl;
    //ADD(a, c)-----> a + c

    return 0;
}

